package com.sqsf.util;

import com.sqsf.javabean.User;
import mapper.UserMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class UserTest {

    SqlSession session;
    UserMapper mapper;

    @Before
    public void a() {
        //1、创建SqlSessionFactory对象，也是单例模式的
        SqlSessionFactory factory = MyBatisUtil.getSqlSessionFactory();
        //2、创建SqlSession对象 true 自动提交事务 不写也没事 因为默认在sqlsession关闭时提交事务
        session = factory.openSession(true);
        //3、调用session的方法namespace的名字.id
        mapper = session.getMapper(UserMapper.class);


    }

    @After
    public void b() {
        //5、关闭资源
        session.close();
    }

    //mybatis缓存
    //mybatis默认开启一级缓存 数据存储在会话中
    //当执行查询语句后查询的结果会保存在缓存中
    //如果在当前会话中 没有进行修改操作 再次执行相同的查询会直接返回缓存
    //可以有效的提高查询效率 降低连接数据库的损耗
    @Test
    public void selectAll() {
        mapper.selectAll();
        System.out.println("~~~~~~~~~~");
        mapper.selectAll();
        System.out.println("~~~~~~~~~~");
        mapper.selectAll();
        System.out.println("~~~~~~~~~~");
    }

    //由于不同方法是不同的会话 所以第二个方法还是执行了sql
    //如果想实现不同会话缓存共用 那么需要开启二级缓存
    //原理：当一个会话结束时 如果开启了二级缓存 会将当前会话所有的一级缓存
    //存储到二级缓存中 这样其他会话就可以使用缓存返回数据了
    //开启二级缓存条件
    //1)在对应的mapper.xml书写标签开启缓存
    //2)二级缓存可以理解为存储在服务器 需要实现序列化接口
    @Test
    public void selectAll1() {
        mapper.selectAll();
        System.out.println("~~~~~~~~~~");
        mapper.selectAll();
        System.out.println("~~~~~~~~~~");
        mapper.selectAll();
        System.out.println("~~~~~~~~~~");
    }
    @Test
    public void insertUser(){
        User u=new User("rg1",200,new Date());
        mapper.insertUser(u);
    }
    @Test
    public void insertUser1(){
        User u=new User("rg1-1",200,new Date());
        mapper.insertUser1(u);
        System.out.println(u);
    }

    @Test
    public void insertUser2(){
        User u=new User("rg1-2",200,new Date());
        mapper.insertUser2(u);
        System.out.println(u);
    }

}